<?php

namespace app\common\model\card;

use app\common\model\BaseModel;
use app\common\model\user\User;
use app\common\model\card\Card;

/**
 * 卡片操作日志模型
 * Class CardOperationLog
 * @package app\common\model\card
 */
class CardOperationLog extends BaseModel
{
    protected $name = 'card_operation_log';

    /**
     * 关联用户
     */
    public function user()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    /**
     * 关联卡片
     */
    public function card()
    {
        return $this->belongsTo(Card::class, 'card_id', 'card_id');
    }

    /**
     * 搜索器-卡号
     */
    public function searchCardNoAttr($query, $value, $data)
    {
        if ($value) {
            $query->where('card_no', 'like', '%' . $value . '%');
        }
    }

    /**
     * 搜索器-卡ID
     */
    public function searchCardIdAttr($query, $value, $data)
    {
        if ($value) {
            $query->where('card_id', 'like', '%' . $value . '%');
        }
    }

    /**
     * 搜索器-用户ID
     */
    public function searchUserIdAttr($query, $value, $data)
    {
        if ($value) {
            $query->where('user_id', '=', $value);
        }
    }

    /**
     * 搜索器-IP地址
     */
    public function searchIpAddressAttr($query, $value, $data)
    {
        if ($value) {
            $query->where('ip_address', 'like', '%' . $value . '%');
        }
    }

    /**
     * 搜索器-创建时间开始
     */
    public function searchCreateTimeStartAttr($query, $value, $data)
    {
        if ($value) {
            $query->where('create_time', '>=', $value);
        }
    }

    /**
     * 搜索器-创建时间结束
     */
    public function searchCreateTimeEndAttr($query, $value, $data)
    {
        if ($value) {
            $query->where('create_time', '<=', $value);
        }
    }

    /**
     * 获取操作类型描述
     */
    public function getOperationTypeAttr($value, $data)
    {
        $params = json_decode($data['params'] ?? '{}', true);
        
        if (isset($params['status'])) {
            return $params['status'] == '1' ? '启用卡片' : '禁用卡片';
        }
        
        if (isset($params['card_bin'])) {
            return '创建/绑定卡片';
        }
        
        if (isset($params['available_balance'])) {
            return '余额查询';
        }
        
        if (isset($params['group_id'])) {
            return '团队变更';
        }
        
        if (isset($params['alias'])) {
            return '别名修改';
        }
        
        return '其他操作';
    }

    /**
     * 获取操作参数（格式化显示）
     */
    public function getParamsTextAttr($value, $data)
    {
        $params = json_decode($data['params'] ?? '{}', true);
        if (empty($params)) {
            return '';
        }
        
        $text = [];
        foreach ($params as $key => $value) {
            if ($key === 'card_no' && strpos($value, '*') !== false) {
                $text[] = '卡号: ' . $value;
            } elseif ($key === 'alias') {
                $text[] = '别名: ' . $value;
            } elseif ($key === 'status') {
                $text[] = '状态: ' . ($value == '1' ? '启用' : '禁用');
            } elseif ($key === 'group_id') {
                $text[] = '团队ID: ' . $value;
            } elseif ($key === 'available_balance') {
                $text[] = '可用余额: ' . $value;
            } else {
                $text[] = $key . ': ' . $value;
            }
        }
        
        return implode(', ', $text);
    }

    /**
     * 获取操作类型标签样式
     */
    public function getOperationTypeTagAttr($value, $data)
    {
        $operationType = $this->getOperationTypeAttr($value, $data);
        
        switch ($operationType) {
            case '启用卡片':
                return 'success';
            case '禁用卡片':
                return 'danger';
            case '创建/绑定卡片':
                return 'primary';
            case '余额查询':
                return 'info';
            case '团队变更':
                return 'warning';
            case '别名修改':
                return 'warning';
            default:
                return 'info';
        }
    }
}